package xyz.xmh.pattern.creational.singletonpattern;

/**
 * DoubleCheckedLockSingleton
 * 双检锁模式
 *
 * @author xuMingHai
 * @since 2021/4/28 星期三 14:56
 */
public class DoubleCheckedLockSingleton {
    /**
     * 添加线程属性同步
     */
    private volatile static DoubleCheckedLockSingleton instance;

    private DoubleCheckedLockSingleton() {
    }

    public static DoubleCheckedLockSingleton getInstance() {
        // 如果不为空，则不需要加锁
        if (instance == null) {

            // 加锁，创建对象之前进行判断
            /*
            如果有两个线程，同时访问，因为加锁的原因，一个线程获得锁，进行判断，为空，new对象，
                另一个线程，再获得锁，判断对象不为空
             */
            synchronized (DoubleCheckedLockSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockSingleton();
                }
            }

        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello DoubleCheckedLockSingleton!");
    }
}
